package com.swak.paxos;

import com.swak.paxos.protocol.PaxosMessage;

/**
 * Learner.
 * 
 * @author DELL
 */
public interface Learner {

	/**
	 * 新一轮
	 */
	void newInstance();

	/**
	 * 此轮已经学习到最新的值.
	 * 
	 * @return
	 */
	boolean isLearned();

	/**
	 * 获得当前学习到的值
	 * 
	 * @return
	 */
	Value getLearnedValue();

	/**
	 * 开启学习
	 */
	void onProposed(PaxosMessage message);

	/**
	 * 收到学习的值： Follower 才会收到这个值
	 * 
	 * @param message
	 */
	void onSendLearnValue(PaxosMessage message);

	/**
	 * 收到学习的值： 回复 ACK（如果需要）
	 * 
	 * @param message
	 */
	void onSendLearnValueAck(PaxosMessage message);

	/**
	 * 响应学习的数据
	 * 
	 * @param message
	 */
	void onAskforLearn(PaxosMessage message);

	/**
	 * 响应需要学习的InstanceID
	 * 
	 * @param message
	 */
	void onSendNowInstanceID(PaxosMessage message);

	/**
	 * 其他节点确认需要学习（沟通好了需要对齐数据）
	 * 
	 * @param message
	 */
	void onComfirmAskforLearn(PaxosMessage message);

}